<?php
/**
 * Created by PhpStorm.
 * User: ysk
 * Date: 2023/1/30
 * Time: 16:48
 */

namespace app\component\tencentCloud\ocr;

use TencentCloud\Ocr\V20181119\Models\BankCardOCRRequest;
use TencentCloud\Ocr\V20181119\Models\GeneralHandwritingOCRRequest;
use TencentCloud\Common\Credential;
use TencentCloud\Common\Profile\ClientProfile;
use TencentCloud\Common\Profile\HttpProfile;
use TencentCloud\Common\Exception\TencentCloudSDKException;
use TencentCloud\Ocr\V20181119\OcrClient;
use TencentCloud\Ocr\V20181119\Models\BankSlipOCRRequest;
use yii\base\Component;

class TencentCloudOcr extends Component
{

    public string $SecretId;
    public string $SecretKey;
    public int $timeout;
    public string $endpoint = 'ocr.tencentcloudapi.com';

    private function OcrClient()
    {
        try {
            // 实例化一个认证对象，入参需要传入腾讯云账户 SecretId 和 SecretKey，此处还需注意密钥对的保密
            // 代码泄露可能会导致 SecretId 和 SecretKey 泄露，并威胁账号下所有资源的安全性。以下代码示例仅供参考，建议采用更安全的方式来使用密钥，请参见：https://cloud.tencent.com/document/product/1278/85305
            // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取

            $cred = new Credential($this->SecretId, $this->SecretKey);
            // 实例化一个http选项，可选的，没有特殊需求可以跳过
            $httpProfile = new HttpProfile();
            $httpProfile->setEndpoint($this->endpoint);
            $httpProfile->setReqMethod(HttpProfile::$REQ_POST);
            $httpProfile->setReqTimeout($this->timeout);

            // 实例化一个client选项，可选的，没有特殊需求可以跳过
            $clientProfile = new ClientProfile();
            $clientProfile->setHttpProfile($httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            return new OcrClient($cred, "ap-beijing", $clientProfile);

        } catch (TencentCloudSDKException $e) {
            echo $e->getMessage();
        }
    }

    /**
     * 银行回单识别
     * 本接口支持银行回单全字段的识别，包括付款开户行、收款开户行、付款账号、收款账号、回单类型、回单编号、币种、流水号、凭证号码、交易机构、交易金额、手续费、日期等字段信息。
     * 文档：https://cloud.tencent.com/document/api/866/57674
     * @param $params
     * @return string
     */
    public function bankSlipOCR($params): string
    {
        // 实例化一个请求对象,每个接口都会对应一个request对象
        $req = new BankSlipOCRRequest();

        $req->fromJsonString(json_encode($params));

        // 返回的resp是一个BankSlipOCRResponse的实例，与请求对象对应
        $resp = $this->OcrClient()->BankSlipOCR($req);

        // 输出json格式的字符串回包
        return $resp->toJsonString();

    }

    /**
     * 通用手写体识别
     * 本接口支持图片内手写体文字的检测和识别，针对手写字体无规则、字迹潦草、模糊等特点进行了识别能力的增强。
     * 文档：https://cloud.tencent.com/document/api/866/36212
     * @param $params
     * @return string
     */
    public function generalHandwritingOCR($params): string
    {
        // 实例化一个请求对象,每个接口都会对应一个request对象
        $req = new GeneralHandwritingOCRRequest();

        $req->fromJsonString(json_encode($params));

        // 返回的resp是一个GeneralHandwritingOCRResponse的实例，与请求对象对应
        $resp = $this->ocrClient()->GeneralHandwritingOCR($req);

        // 输出json格式的字符串回包
        return $resp->toJsonString();

    }

    /**
     * 银行卡识别
     * 本接口支持对中国大陆主流银行卡正反面关键字段的检测与识别，包括卡号、卡类型、卡名字、银行信息、有效期。支持竖排异形卡识别、多角度旋转图片识别。
     * 支持对复印件、翻拍件、边框遮挡的银行卡进行告警，可应用于各种银行卡信息有效性校验场景，如金融行业身份认证、第三方支付绑卡等场景。
     * 文档：https://cloud.tencent.com/document/api/866/36216
     * @param $params
     * @return string
     */
    public function bankCardOCR($params): string
    {
        // 实例化一个请求对象,每个接口都会对应一个request对象
        $req = new BankCardOCRRequest();

        $req->fromJsonString(json_encode($params));

        // 返回的resp是一个BankCardOCRResponse的实例，与请求对象对应
        $resp = $this->ocrClient()->BankCardOCR($req);

        // 输出json格式的字符串回包
        return $resp->toJsonString();
    }

}
